#ifndef __CLI_H
#define __CLI_H

#define HISTORY_PATH    "myapp_history.txt"


typedef void (*command_handler_t) (int argc, char** argv);

typedef enum {
    ARG_STRING,     // 字符串参数
    ARG_NUM,        // 数字参数
    ARG_FILE,       // 文件参数
    ARG_DIR,        // 目录参数
    ARG_COMMAND,    // 命令参数
    ARG_BOOL,       // 布尔参数
    ARG_ENUM,       // 枚举参数
} ArgType;


// 参数结构体
typedef struct Argument {
    char *name;
    char *descripute;
    char *usage;
    // ArgType type;
    // char **options;
    // int option_count;
    int required;       // 是否必须
    struct Argument *next;
}Argument_t;

// 子命令 子命令没有回调函数，直接使用命令的回调函数
typedef struct SubCommand {
    char *name;
    char *descripute;
    Argument_t *args;
    struct SubCommand *next;
} SubCommand_t;

// 命令结构体
typedef struct Command {
    char *name;                     // 命令名
    char *description;              // 命令描述     hint提示用
    char *usage;                    // 使用方式     help 显示用
    command_handler_t handler;     // 回调函数
    Argument_t *args;              // 参数列表
    SubCommand_t *subcommands;       // 子命令
    struct Command* next;
}Command_t;

int register_command (Command_t* new_cmd);
void add_command_argment(Command_t *cmd, Argument_t *arg);
void free_commands();
void initalize_linenoise(void);
<<<<<<< Updated upstream
void execute_command(const char *line);
=======
int execute_command(char *line);
>>>>>>> Stashed changes

#endif
